home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1999 #2 / Amiga Plus CD - 1999 - No. 2.iso / System-Boost / Workbench / ToolManager / Source / Prefs / listpanel.c < prev    next >
C/C++ Source or Header  |  1998-06-17  |  6KB  |  197 lines

  1. /*
  2.  * listpanel.c  V3.1
  3.  *
  4.  * ListPanel class
  5.  *
  6.  * Copyright (C) 1990-98 Stefan Becker
  7.  *
  8.  * This source code is for educational purposes only. You may study it
  9.  * and copy ideas or algorithms from it for your own projects. It is
  10.  * not allowed to use any of the source codes (in full or in parts)
  11.  * in other programs. Especially it is not allowed to create variants
  12.  * of ToolManager or ToolManager-like programs from this source code.
  13.  *
  14.  */
  15.  
  16. #include "toolmanager.h"
  17.  
  18. /* Local data */
  19. static const char *TextNewGroup;
  20. static const char *HelpNewGroup;
  21. static const char *TextNewObject;
  22. static const char *HelpNewObject;
  23. static const char *TextSort;
  24. static const char *HelpSort;
  25.  
  26. /* ListPanel class instance data */
  27. struct ListPanelClassData {
  28.  Object *lpcd_List;
  29. };
  30. #define TYPED_INST_DATA(cl, o) ((struct ListPanelClassData *) INST_DATA((cl), (o)))
  31.  
  32. /* ListPanel class method: OM_NEW */
  33. #define DEBUGFUNCTION ListPanelClassNew
  34. static ULONG ListPanelClassNew(Class *cl, Object *obj, struct opSet *ops)
  35. {
  36.  Object *Listview;
  37.  Object *NewGroupButton;
  38.  Object *NewObjectButton;
  39.  Object *DeleteButton;
  40.  Object *SortButton;
  41.  Object *List;
  42.  
  43.  LISTPANEL_LOG((LOG1(Tags, "0x%08lx", ops->ops_AttrList),
  44.                 PrintTagList(ops->ops_AttrList)))
  45.  
  46.  if (obj = (Object *) DoSuperNew(cl, obj,
  47.       MUIA_Group_Horiz, FALSE,
  48.       Child, Listview = ListviewObject,
  49.        MUIA_Listview_DragType, MUIV_Listview_DragType_Immediate,
  50.        MUIA_Listview_List,     List = NewObjectA(ListTreeClass->mcc_Class,
  51.                                                  NULL, ops->ops_AttrList),
  52.        MUIA_CycleChain,        TRUE,
  53.       End,
  54.       Child, HGroup,
  55.        MUIA_Group_SameWidth, TRUE,
  56.        Child, NewGroupButton  = MakeButton(TextNewGroup,     HelpNewGroup),
  57.        Child, NewObjectButton = MakeButton(TextNewObject,    HelpNewObject),
  58.        Child, DeleteButton    = MakeButton(TextGlobalDelete, HelpGlobalDelete),
  59.        Child, SortButton      = MakeButton(TextSort,         HelpSort),
  60.       End,
  61.       TAG_MORE, ops->ops_AttrList)) {
  62.   struct ListPanelClassData *lpcd = TYPED_INST_DATA(cl, obj);
  63.  
  64.   /* Initialize instance data */
  65.   lpcd->lpcd_List = List;
  66.  
  67.   /* Add methods to buttons */
  68.   DoMethod(NewGroupButton,  MUIM_Notify, MUIA_Pressed, FALSE,
  69.            List, 1, TMM_NewGroup);
  70.   DoMethod(NewObjectButton, MUIM_Notify, MUIA_Pressed, FALSE,
  71.            List, 1, TMM_NewObject);
  72.   DoMethod(DeleteButton,    MUIM_Notify, MUIA_Pressed, FALSE,
  73.            List, 4, MUIM_Listtree_Remove, MUIV_Listtree_Remove_ListNode_Root,
  74.                     MUIV_Listtree_Remove_TreeNode_Active, 0);
  75.   DoMethod(SortButton,      MUIM_Notify, MUIA_Pressed, FALSE,
  76.            List, 1, TMM_Sort);
  77.  }
  78.  
  79.  LISTPANEL_LOG(LOG1(Result, "0x%08lx", obj))
  80.  
  81.  /* Return pointer to created object */
  82.  return((ULONG) obj);
  83. }
  84.  
  85. /* ListPanel class method: TMM_WBArg */
  86. #undef  DEBUGFUNCTION
  87. #define DEBUGFUNCTION ListPanelClassWBArg
  88. static ULONG ListPanelClassWBArg(Class *cl, Object *obj,
  89.                                  struct TMP_WBArg *tmpwa)
  90. {
  91.  Object                        *list = TYPED_INST_DATA(cl, obj)->lpcd_List;
  92.  struct MUIS_Listtree_TreeNode *tn;
  93.  Object                        *rc   = NULL;
  94.  
  95.  /* Create new object */
  96.  if (tn = (struct MUIS_Listtree_TreeNode *) DoMethod(list, TMM_NewObject)) {
  97.  
  98.   LISTPANEL_LOG(LOG1(TreeNode, "0x%08lx", tn))
  99.  
  100.   /* Forward method to new object */
  101.   if (DoMethodA(tn->tn_User, (Msg) tmpwa)) {
  102.  
  103.    /* Method succeeded, redraw list */
  104.    DoMethod(list, MUIM_List_Redraw, MUIV_List_Redraw_All);
  105.  
  106.    /* Set return code */
  107.    rc = tn->tn_User;
  108.  
  109.   } else {
  110.  
  111.    LISTPANEL_LOG(LOG0(Object could not use the WBArg))
  112.  
  113.    /* Method failed, remove object again */
  114.    DoMethod(list, MUIM_Listtree_Remove, MUIV_Listtree_Remove_ListNode_Root, tn,
  115.             0);
  116.   }
  117.  }
  118.  
  119.  LISTPANEL_LOG(LOG1(Result, "0x%08lx", rc))
  120.  
  121.  /* Return pointer to new object */
  122.  return((ULONG) rc);
  123. }
  124.  
  125. /* ListPanel class method dispatcher */
  126. #undef  DEBUGFUNCTION
  127. #define DEBUGFUNCTION ListPanelClassDispatcher
  128. __geta4 static ULONG ListPanelClassDispatcher(__a0 Class *cl, __a2 Object *obj,
  129.                                               __a1 Msg msg)
  130. {
  131.  ULONG rc;
  132.  
  133.  LISTPANEL_LOG(LOG3(Arguments, "Class 0x%08lx Object 0x%08lx Msg 0x%08lx",
  134.                     cl, obj, msg))
  135.  
  136.  switch(msg->MethodID) {
  137.   /* BOOPSI methods */
  138.   case OM_NEW:
  139.    rc = ListPanelClassNew(cl, obj, (struct opSet *) msg);
  140.    break;
  141.  
  142.   /* Forward some MUI Listtree methods to embedded list object   */
  143.   /* NOTE: We can't rely on the forward mechanism of the group   */
  144.   /*       superclass because we need the return code for these! */
  145.   case MUIM_Listtree_Insert:
  146.   case MUIM_Listtree_Remove:
  147.   case MUIM_Listtree_GetEntry:
  148.   case MUIM_Listtree_FindName:
  149.    rc = DoMethodA(TYPED_INST_DATA(cl, obj)->lpcd_List, msg);
  150.    break;
  151.  
  152.   /* TM methods */
  153.   case TMM_WBArg:
  154.    rc = ListPanelClassWBArg(cl, obj, (struct TMP_WBArg *) msg);
  155.    break;
  156.  
  157.   /* Unknown method -> delegate to SuperClass */
  158.   default:
  159.    rc = DoSuperMethodA(cl, obj, msg);
  160.    break;
  161.  }
  162.  
  163.  return(rc);
  164. }
  165.  
  166. /* Create ListPanel class */
  167. #undef  DEBUGFUNCTION
  168. #define DEBUGFUNCTION CreateListPanelClass
  169. struct MUI_CustomClass *CreateListPanelClass(void)
  170. {
  171.  struct MUI_CustomClass *rc;
  172.  
  173.  /* Create class */
  174.  if (rc = MUI_CreateCustomClass(NULL, MUIC_Group, NULL,
  175.                                 sizeof(struct ListPanelClassData),
  176.                                 ListPanelClassDispatcher)) {
  177.  
  178.   /* Localize strings */
  179.   TextNewGroup  = TranslateString(LOCALE_TEXT_LISTPANEL_NEW_GROUP_STR,
  180.                                   LOCALE_TEXT_LISTPANEL_NEW_GROUP);
  181.   HelpNewGroup  = TranslateString(LOCALE_HELP_LISTPANEL_NEW_GROUP_STR,
  182.                                   LOCALE_HELP_LISTPANEL_NEW_GROUP);
  183.   TextNewObject = TranslateString(LOCALE_TEXT_LISTPANEL_NEW_OBJECT_STR,
  184.                                   LOCALE_TEXT_LISTPANEL_NEW_OBJECT);
  185.   HelpNewObject = TranslateString(LOCALE_HELP_LISTPANEL_NEW_OBJECT_STR,
  186.                                   LOCALE_HELP_LISTPANEL_NEW_OBJECT);
  187.   TextSort      = TranslateString(LOCALE_TEXT_LISTPANEL_SORT_STR,
  188.                                   LOCALE_TEXT_LISTPANEL_SORT);
  189.   HelpSort      = TranslateString(LOCALE_HELP_LISTPANEL_SORT_STR,
  190.                                   LOCALE_HELP_LISTPANEL_SORT);
  191.  }
  192.  
  193.  LISTPANEL_LOG(LOG1(Result, "0x%08lx", rc))
  194.  
  195.  return(rc);
  196. }
  197.